Promise.finally = function (onFinallyed) {
    /**
     * finally() 虽然与 .then(onFinally, onFinally) 类似，它们不同的是：
     *调用内联函数时，不需要多次声明该函数或为该函数创建一个变量保存它。
     *由于无法知道promise的最终状态，所以finally的回调函数中不接收任何参数，
     *它仅用于无论最终结果如何都要执行的情况。
     *与Promise.resolve(2).then(() => {}, () => {}) 
     *（resolved的结果为undefined）不同，Promise.resolve(2).finally(() => {}) resolved的结果为 2。
     *同样，Promise.reject(3).then(() => {}, () => {}) 
     *(fulfilled的结果为undefined), Promise.reject(3).finally(() => {}) rejected 的结果为 3。
     */
    return this.then(onFinallyed, onFinallyed)
}

/**
 * 
 * @param {*} callback 
 * @returns 
 */
Promise.prototype.finally = function (callback) {
    let P = this.constructor;
    return this.then(
        value => P.resolve(callback()).then(() => value),
        reason => P.resolve(callback()).then(() => { throw reason })
    );
};